package br.com.tiespec.ejb.Ejb;

import java.util.Date;
import java.util.List;

import javax.ejb.EJB;
import javax.ejb.Local;
import javax.ejb.Stateless;

import br.com.tiespec.ejb.Dao.UsuarioDAO;
import br.com.tiespec.ejb.EjbInterface.AprovacaoUsuarioInterface;
import br.com.tiespec.ejb.Util.MensagemUtil;
import br.com.tiespec.model.Enum.SituUsuario;
import br.com.tiespec.model.Enum.TipoSortOrder;
import br.com.tiespec.model.Modelo.Usuario;
import br.com.tiespec.model.Util.CriptoHashUtil;
import br.com.tiespec.model.Util.DAOException;
import br.com.tiespec.model.Util.EmailUtil;
import br.com.tiespec.model.Util.RNException;

@Stateless(mappedName = "AprovacaoUsuarioImpl")
@Local(value=AprovacaoUsuarioInterface.class)
public class AprovacaoUsuarioImpl implements AprovacaoUsuarioInterface {

	private static final long serialVersionUID = 1L;
	
	@EJB UsuarioDAO uDao;
	
	@Override
	public List<Usuario> listarUsuario(int first, int pageSize,
			String sortField, TipoSortOrder sortOrder,Long idClientePortal, String varNome,
			String varEmail, Date varCadastroDe, Date varCadastroAte) {
		return uDao.listarUsuarioPendenteAprovacao(first, pageSize, sortField, sortOrder, 
				idClientePortal, varNome, varEmail, varCadastroDe, varCadastroAte);
	}

	@Override
	public Integer countUsuario(Long idClientePortal, String varNome, String varEmail,
			Date varCadastroDe, Date varCadastroAte) {
		return uDao.countUsuarioPendenteAprovacao(idClientePortal, varNome, varEmail, varCadastroDe, varCadastroAte);
	}

	@Override
	public Usuario selecionarUsuario(Long id) {
		return uDao.selecionarUsuario(id);
	}

	@Override
	public void aprovarUsuario(Long id) throws RNException {
		try {
			Usuario uInstance = uDao.selecionarUsuarioComCliente(id);

			String senhaUsuario = this.gerarSenha();
			uInstance.setSenha(CriptoHashUtil.hash("SHA1", senhaUsuario));
			
			enviarEmailAprovacao(uInstance.getCliente().getNomeCompleto(), uInstance.getEmail(), senhaUsuario);
			
			uInstance.setDataCadastro(new Date());
			uInstance.setSituacao(SituUsuario.ATIVO);
			uInstance.setEmailEnviado(true);
			
			uDao.update(uInstance);
		} catch (DAOException e) {
			e.printStackTrace();
			throw new RNException(e);
		}
	}
	
	private String gerarSenha(){
		String senha = "";
		int random;
		boolean v = false;
		for(int i = 0; i<8; i++) {
			v = false;
			do {
				random = (int) (Math.random() * 122);
				if (random >= 48 && random <= 57)
					v = true;
				else if (random >= 97 && random <= 122)
					v = true;
				else if (random >= 65 && random <= 90)
					v = true;
			} while (!v);
			senha += ((char) random);
		}
		return senha;
	}
	
	private void enviarEmailAprovacao(String nomeCliente, String email, String senha) {
		String msg = MensagemUtil.getMsg("EmailAprovacaoUsuario_Mensagem", nomeCliente, email, senha);
		try {
			EmailUtil mail = new EmailUtil();
			mail.setTitulo(MensagemUtil.getMsg("EmailAprovacaoUsuario_Titulo"));
			mail.setMensagem(msg);
			mail.adicionarDestinatario(email);
			mail.send();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}